home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prdisk.asm < prev    next >
Assembly Source File  |  1995-05-12  |  7KB  |  324 lines

  1.     processor 6502
  2.  
  3.     include "jmptab.inc"
  4.  
  5. #if target & pet4001
  6.     include "include/petram34.lib"
  7.     include "include/petrom4.lib"
  8. #endif
  9. #if target & pet3001
  10.     include "include/petram34.lib"
  11.     include "include/petrom3.lib"
  12. #endif
  13. #if target & (c64 | c128 | vic20)
  14.     include "include/cbmrom.lib"
  15. #endif
  16.  
  17.     seg code
  18.     org prutils
  19.  
  20. cmd_dread    = 1 ; command for reading a disk
  21. cmd_dwrite    = 2 ; command for writing a disk
  22.  
  23. entry:
  24.     lda #0        ; send ack
  25.     jsr send_switch
  26.  
  27. loop:
  28.     ; copy a disk protocol:
  29.     ; C=             PC or Amiga
  30.     ; ack (00) ->
  31.     ;             <- function: 0=quit, 1=read disk, 2=write disk
  32.     ;             <- device #
  33.     ; <status (0=ok)> ->
  34.     ;
  35.     ; read disk:
  36.     ; <floppy status (0=ok)><chksum>datablock (256 bytes) ->
  37.     ;             <- ok (80) or again (81) or stop (82)
  38.     ; send same or next block, accordingly
  39.     ; last block will be notified with the error code 66
  40.     ; (illegal track or sector)
  41.     ;
  42.     ; write disk:
  43.     ;             <- <flag><chksum>datablock (256 bytes)
  44.     ; ok (80) or again (81) or stop (82 followed by error code) ->
  45.     ; last block will be notified with a non-zero flag.
  46.  
  47.     jsr receive_switch    ; get function
  48.     tay
  49.     bne noexit$    ; check if it was an exit command
  50. jmpxit$:
  51.     jmp exit    ; reinstall server and exit.
  52. noexit$:
  53.     cmp #cmd_dread    ; is it a legal command?
  54.     beq init
  55.     cmp #cmd_dwrite
  56.     bne jmpxit$
  57.  
  58. init:    pha
  59.     jsr receive    ; receive device number
  60.     sta fa
  61.     lda #15
  62.     sta sa        ; error channel number
  63.     sta la
  64.     lda #0
  65.     sta fnlen    ; use zero file name
  66.     jsr open
  67.     lda status    ; check if it succeeded
  68.     beq ok
  69. abort_init:
  70.     pla
  71. abortst:
  72.     jsr send_switch ; send a non-zero number
  73. abort:    jsr clrchn
  74.     lda #2
  75.     jsr close    ; close the files
  76.     lda #15
  77.     jsr close
  78.     jmp loop
  79.  
  80. ok:    lda #2
  81.     sta sa        ; use channel 2 for buffer
  82.     sta la
  83.     lda #filenend-filename
  84.     sta fnlen    ; use the file name "#"
  85.     lda #<filename
  86.     sta fnadr
  87.     lda #>filename
  88.     sta fnadr + 1
  89.     jsr open
  90.     lda status
  91.     bne abort_init
  92.     jsr send_switch ; send status code 0 (ok)
  93.  
  94.     pla
  95.     cmp #cmd_dwrite ; branch according to the function specified
  96.     beq write
  97.  
  98.     lda #"1"        ; select read operation
  99.     jsr seek1    ; reset the track and sector pointers
  100.         ; loop to send blocks from the disk
  101. nextblock$:
  102.     jsr advance    ; command to get next sector, error code is in A
  103.     bne abortst    ; break in case of error
  104.  
  105.     ldx #2
  106.     jsr chkin
  107.     ldx #0
  108.     stx checksum    ; clear checksum
  109.  
  110. read$:            ; read 256 bytes from the disk
  111.     jsr stop    ; test stop key
  112.     bne noabort$
  113.     lda #2        ; send error code 2 (user break)
  114.     bne abortst
  115. noabort$:
  116.     jsr chrin
  117.     sta filebuf,x
  118.     clc        ; add into checksum
  119.     adc checksum
  120.     sta checksum
  121.     inx        ; x ranges from 00 to FF
  122.     bne read$
  123.  
  124.     txa
  125.     jsr send_switch ; send the status code (0)
  126.     jsr clrchn    ; restore normal file I/O assignments
  127.             ; now go send the buffer
  128. sameblock$:
  129.     lda checksum
  130.     jsr send_switch ; send checksum
  131.     ldx #0
  132. send$:    lda filebuf,x
  133.     jsr send
  134.     inx
  135.     bne send$
  136.             ; wait for go on, repeat, or abort.
  137.     jsr receive_switch
  138.     cmp #$80
  139.     beq nextblock$
  140.     cmp #$81
  141.     beq sameblock$
  142. abortj: jmp abort    ; $82 (or other values) abort
  143.  
  144. write:    lda #"1"        ; first select read operation and
  145.     jsr seek1    ; try to read track 1, sector 0
  146.     jsr advance    ; (the error is ignored, this is only a kludge
  147.             ; to make the b-p command work)
  148.     lda #"2"        ; select write operation
  149.     jsr seek1    ; reset the track and sector pointers
  150.         ; loop to receive blocks for the disk
  151.  
  152. nextblock$:
  153.     jsr receive_switch
  154.     tax        ; copy the return code to X
  155.     bne abortj    ; nonzero return value indicates end of transmission
  156. sameblock$:
  157.     jsr receive_switch
  158.     pha        ; store checksum
  159.     stx checksum    ; clear checksum
  160.  
  161. receive$:        ; receive 256 bytes for the disk
  162.     jsr receive
  163.     sta filebuf,x
  164.     clc        ; add to checksum
  165.     adc checksum
  166.     sta checksum
  167.     inx        ; x ranges from 00 to FF
  168.     bne receive$
  169.  
  170.     pla
  171.     cmp checksum    ; compare the checksums
  172.     beq received$
  173.     lda #$81
  174.     jsr send_switch ; request the block again in case of error
  175.     jmp sameblock$    ; get the block again
  176.  
  177. received$:        ; send the data to the drive
  178.     ldx #15
  179.     jsr chkout    ; first issue the B-P command
  180.     ldx #bpend-bp-1
  181. sendbp$:
  182.     lda bp,x
  183.     jsr chrout
  184.     dex
  185.     bpl sendbp$
  186.     ldx #2
  187.     jsr chkout    ; then set the output channel
  188.     ldx #0
  189. send$:    lda filebuf,x    ; send the data to the floppy
  190.     jsr chrout
  191.     inx
  192.     bne send$
  193.     jsr clrchn
  194.  
  195.     jsr stop    ; test stop key
  196.     beq error$    ; abort the transfer when necessary
  197.     jsr advance    ; try to write the sector
  198.     bne error$    ; abort the transfer in case of error
  199.     lda #$80
  200.     jsr send_switch ; acknowledge the data block to the remote end
  201.     jmp nextblock$    ; get the next data block
  202. stopped$:
  203.     lda #0
  204. error$: pha
  205.     lda #$82
  206.     jsr send_switch ; tell the remote end to abort the transfer
  207.     pla
  208.     jmp abortst    ; and return the error code
  209.  
  210. seek1:    sta _cmd    ; select operation ("1"=read, "2"=write)
  211.     lda #"0"        ; reset the track and sector numbers
  212.     ldx #2
  213. 0$:    sta track,x
  214.     sta sector,x
  215.     dex
  216.     bpl 0$
  217.     rts
  218.  
  219. advance:        ; go to next sector (or track),
  220.     ldx #2        ; return error code in A, use Z as error flag
  221. incsect$:        ; increment the sector number
  222.     lda #"9"
  223.     inc sector,x
  224.     cmp sector,x
  225.     bcs advanced$
  226.     lda #"0"
  227.     sta sector,x
  228.     dex
  229.     bpl incsect$
  230.     bcc adv_track$    ; branch always (sector number overflow)
  231.  
  232. advanced$:        ; try to read or write the sector
  233.     ldx #15
  234.     jsr chkout
  235.     ldy #0
  236. send$:    lda string,y    ; send the command
  237.     jsr chrout
  238.     iny
  239.     cpy #_strend-string
  240.     bcc send$
  241.     jsr clrchn
  242.  
  243.     jsr geterror    ; get the error code from the drive
  244.     beq return$    ; no error
  245.  
  246.     cmp #66     ; was it an illegal track or sector?
  247.     bne return$    ; no, some other error => return
  248.  
  249.     lda #"0"        ; check the sector number (should be nonzero)
  250.     ldx #2
  251. check_sector$:
  252.     cmp sector,x
  253.     bne sector_ok$
  254.     dex
  255.     bpl check_sector$
  256.     bmi return66$    ; branch always
  257.  
  258. sector_ok$:
  259.     ldx #2
  260. zero_sector$:        ; reset the sector number
  261.     sta sector,x
  262.     dex
  263.     bpl zero_sector$
  264.  
  265. adv_track$:        ; increase the track number
  266.     ldx #2
  267. inctrack$:
  268.     lda #"9"
  269.     inc track,x
  270.     cmp track,x
  271.     bcs advanced$
  272.     lda #"0"
  273.     sta track,x
  274.     dex
  275.     bpl inctrack$
  276.             ; fall through in case of track number overflow
  277.  
  278. return66$:
  279.     lda #66     ; return with error code 66 (end of copy)
  280. return$:
  281.     rts
  282.  
  283. geterror:        ; read the disk error channel
  284.     ldx #15
  285.     jsr chkin    ; select the error channel
  286.     jsr chrin    ; read the first digit
  287.     and #$0f
  288.     tax        ; and store it
  289.     jsr chrin    ; read the second digit
  290.     clc
  291.     and #$0f
  292. 0$:    dex        ; combine the digits to one number
  293.     bmi 1$
  294.     adc #10
  295.     bne 0$        ; branch always
  296. 1$:    pha
  297. 2$:    jsr chrin
  298.     lda status
  299.     beq 2$
  300.     jsr clrchn    ; clear the channel
  301.     pla
  302.     rts        ; return (error code in accumulator)
  303.  
  304. filename: .byte "#"
  305. filenend:
  306. string: .byte "U"
  307. _cmd:    .byte "1:2 0 "
  308. track:    .byte "000 "
  309. sector: .byte "000"
  310. _strend:
  311. bp:    .byte "0 2:P-B" ; string stored backwards
  312. bpend:
  313. endcode = .
  314.  
  315.     seg.u bss
  316.     org endcode
  317.  
  318. checksum:
  319.     ds.b 1        ; save block length
  320. filebuf:
  321.     ds.b 256    ; checksum followed by 255 bytes of file data
  322.  
  323. endbss = .
  324.